/*
 * ImageAnimView.h
 *
 *  Created on: 2024年8月17日
 *      Author: ZKSWE Develop Team
 */

#ifndef _UI_IMAGE_ANIM_VIEW_H_
#define _UI_IMAGE_ANIM_VIEW_H_

#include "control/ZKBase.h"
#include "system/Thread.h"
#include "utils/BitmapHelper.h"
#include "utils/MessageQueue.h"

namespace ui {

// 定义一个表示矩形区域的结构体，用于描述图像或动画中的各个区域。
typedef struct {
    uint16_t left;   // 区域左边界坐标
    uint16_t top;    // 区域上边界坐标
    uint16_t right;  // 区域右边界坐标
    uint16_t bottom; // 区域下边界坐标
} region_t;

// ImageAnimView 类继承自 ZKBase 和 Thread，用于处理图像动画视图。
class ImageAnimView : public ZKBase, public Thread {
public:
    // 构造函数，初始化一个新的 ImageAnimView 实例。
    ImageAnimView(ZKBase *parent, int id, const LayoutPosition &pos);

    // 析构函数，清理资源并释放内存。
    virtual ~ImageAnimView();

    // 加载指定目录下的图像动画资源。
    bool load(const std::string &dir);

    // 播放指定索引的动画帧，sync 参数决定是否同步播放。
    void play(int index, bool sync = false);

protected:
    // 处理播放逻辑的辅助函数。
    void procPlay(int index);

    // 释放当前加载的所有资源。
    void release();

    // 绘制图像到画布上的虚拟函数，由派生类实现。
    virtual void onDraw(ZKCanvas *pCanvas);

    // 线程主循环，负责处理消息队列中的消息。
    virtual bool threadLoop();

    // 定义的消息类型枚举，用于内部通信。
    enum {
        E_MSG_PLAY,  // 播放消息
        E_MSG_EXIT   // 退出消息
    };

private:
    // 位图指针，指向用于绘制背景的画布图像。
    bitmap_t *canvas_bmp_;

    // 内存中存储的图像数据，用于实际显示。
    bitmap_t img_bmp_;

    // 存储资源文件所在的目录路径。
    std::string dir_;

    // 互斥锁，用于保护共享资源的线程安全访问。
    Mutex lock_;

    // 消息队列，用于在不同线程之间传递消息。
    MessageQueue msg_queue_;

    // 脏区域，记录需要重绘的区域。
    region_t dirty_;

    // 指向区域列表的指针，包含所有可交互区域的信息。
    region_t *region_list_;

    // 区域列表中的元素数量。
    uint32_t list_count_;

    // 当前播放的动画帧索引。
    int play_index_;
};

}

#endif /* _UI_IMAGE_ANIM_VIEW_H_ */
